package org.pictual.business.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;

import org.apache.log4j.Logger;
import org.pictual.business.dao.exceptions.DAOException;
import org.pictual.business.vo.DefinicionVO;


public class MySqlDefinicionDAO implements DefinicionDAO {

	private Connection connection;
	private ResourceBundle queries=ResourceBundle.getBundle("org.pictual.business.dao.MySqlDefinicionDAO");
	protected static Logger log= Logger.getLogger(MySqlDefinicionDAO.class);

	public MySqlDefinicionDAO(){}
	
	public MySqlDefinicionDAO(Connection connection){
		this.connection=connection;
	}

	/**
	 * AccesoBD
	 */
	public DefinicionVO readDefinicion(int palabra_id, int idioma_origen, int idioma_destino) throws DAOException {
		AccesoBD accesoBD = new AccesoBD();
		ResultSet rs=null;
		DefinicionVO definicionVO = null;
		final String query=queries.getString("readDefinicion");
		try {
			rs=accesoBD.ejecutarConsulta(
					query, 
					palabra_id, 
					idioma_origen, 
					idioma_destino
					);

			if(rs!=null){
			
				while(rs.next()){
					definicionVO=new DefinicionVO();
	
					definicionVO.setPalabra_id(rs.getInt("palabra_id"));
					definicionVO.setIdioma_origen(rs.getInt("idioma_origen"));
					definicionVO.setIdioma_destino(rs.getInt("idioma_destino"));
					definicionVO.setDefinicion_1(rs.getString("definicion_1"));
					definicionVO.setDefinicion_2(rs.getString("definicion_2"));
					definicionVO.setDefinicion_3(rs.getString("definicion_3"));
					definicionVO.setEjemplo_1(rs.getString("ejemplo_1"));
					definicionVO.setEjemplo_2(rs.getString("ejemplo_2"));
					definicionVO.setEjemplo_3(rs.getString("ejemplo_3"));
					definicionVO.setCompleto(rs.getBoolean("completo"));
					definicionVO.setAuto_actualizado(rs.getInt("auto_actualizado"));
					definicionVO.setVisitas(rs.getInt("visitas"));
					definicionVO.setContador_wiki(rs.getInt("contador_wiki"));
					definicionVO.setInfo_direccion(rs.getString("info_direccion"));
	
					log.info("Obtencion de DefinicionVO de"+definicionVO.getPalabra_id()+" de base de datos con exito");
				}
			}	
		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally{
			accesoBD.desconectar();
			accesoBD.cerrarResultSet(rs);
		}
		
		return definicionVO;
	}
	
	/**
	 * @deprecated
	 */
	public DefinicionVO readDefinicion2(int palabra_id, int idioma_origen, int idioma_destino) throws DAOException {
		ResultSet rs=null;
		PreparedStatement ps=null;
		DefinicionVO definicionVO = null;
		final String query=queries.getString("readDefinicion");
		try {
			if(null == ps){ 
				ps= connection.prepareStatement(query);
				ps.setInt(1, palabra_id);
				ps.setInt(2, idioma_origen);
				ps.setInt(3, idioma_destino);
				rs = ps.executeQuery();
				while(rs.next()){
					definicionVO=new DefinicionVO();

					definicionVO.setPalabra_id(rs.getInt("palabra_id"));
					definicionVO.setIdioma_origen(rs.getInt("idioma_origen"));
					definicionVO.setIdioma_destino(rs.getInt("idioma_destino"));
					definicionVO.setDefinicion_1(rs.getString("definicion_1"));
					definicionVO.setDefinicion_2(rs.getString("definicion_2"));
					definicionVO.setDefinicion_3(rs.getString("definicion_3"));
					definicionVO.setEjemplo_1(rs.getString("ejemplo_1"));
					definicionVO.setEjemplo_2(rs.getString("ejemplo_2"));
					definicionVO.setEjemplo_3(rs.getString("ejemplo_3"));
					definicionVO.setCompleto(rs.getBoolean("completo"));
					definicionVO.setAuto_actualizado(rs.getInt("auto_actualizado"));
					definicionVO.setVisitas(rs.getInt("visitas"));
					definicionVO.setContador_wiki(rs.getInt("contador_wiki"));
					definicionVO.setInfo_direccion(rs.getString("info_direccion"));

					log.info("Obtencion de DefinicionVO de"+definicionVO.getPalabra_id()+" de base de datos con exito");
				}
			}

		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally {
			try {
				rs.close();
				ps.close();
				connection.close();
			} catch (SQLException e) {
				log.error("Error al cerrar la consulta: "+query, e);
			}
		}

		return definicionVO;
	}
	
	/**
	 * AccesoBD
	 */
	public void insertDefinicion(DefinicionVO definicionVO) throws DAOException {
		AccesoBD accesoBD = new AccesoBD();
		String query =queries.getString("insertDefinicion");
		
		try {
			
		/*
		 * INSERT INTO palabra_definicion (
		 * palabra_id, 
		 * idioma_origen, 
		 * idioma_destino, 
		 * definicion_1, 
		 * definicion_2, 
		 * definicion_3, 
		 * ejemplo_1, 
		 * ejemplo_2, 
		 * ejemplo_3, 
		 * completo, 
		 * auto_actualizado, 
		 * visitas, 
		 * contador_wiki, 
		 * info_direccion) 
		 * VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
		 * 
		 */
			accesoBD.ejecutarActualizacion(
					query,
					definicionVO.getPalabra_id(),
					definicionVO.getIdioma_origen(),
					definicionVO.getIdioma_destino(),
					definicionVO.getDefinicion_1(),
					definicionVO.getDefinicion_2(),
					definicionVO.getDefinicion_3(),
					definicionVO.getEjemplo_1(),
					definicionVO.getEjemplo_2(),
					definicionVO.getEjemplo_3(),
					definicionVO.isCompleto(),
					definicionVO.getAuto_actualizado(),
					definicionVO.getVisitas(),
					definicionVO.getContador_wiki(),
					definicionVO.getInfo_direccion()
					);
			
			log.info("Inserción de DefinicionVO de"+definicionVO.getPalabra_id()+" en base de datos con exito");

		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		} finally{
			accesoBD.desconectar();
		}
		
		
	}
	
	/**
	 * @deprecated
	 * @param definicionVO
	 * @throws DAOException
	 */
	public void insertDefinicion2(DefinicionVO definicionVO) throws DAOException {
		String query =queries.getString("insertDefinicion");
		PreparedStatement ps=null;
		try {
			if(null == ps){
				ps=connection.prepareStatement(query);

				ps.setInt(1, definicionVO.getPalabra_id());
				ps.setInt(2, definicionVO.getIdioma_origen());
				ps.setInt(3, definicionVO.getIdioma_destino());
				ps.setString(4, definicionVO.getDefinicion_1());
				ps.setString(5, definicionVO.getDefinicion_2());
				ps.setString(6, definicionVO.getDefinicion_3());
				ps.setString(7, definicionVO.getEjemplo_1());
				ps.setString(8, definicionVO.getEjemplo_2());
				ps.setString(9, definicionVO.getEjemplo_3());
				ps.setBoolean(10, definicionVO.isCompleto());
				ps.setInt(11, definicionVO.getAuto_actualizado());
				ps.setInt(12, definicionVO.getVisitas());
				ps.setInt(13, definicionVO.getContador_wiki());
				ps.setString(14, definicionVO.getInfo_direccion());

				ps.executeUpdate();
				log.info("Inserción de DefinicionVO de"+definicionVO.getPalabra_id()+" en base de datos con exito");
			}
		} catch (SQLException e) {
			log.error("Error al ejecutar: "+query, e);
			throw new DAOException(query, e);
		}  finally {
			try {
				ps.close();
				connection.close();
			} catch (SQLException e) {
				log.error("Error al cerrar la consulta: "+query, e);
			}
		}
	}



}
